package com.ruoyi.sale.mapper;

import com.ruoyi.product.domain.Product;
import com.ruoyi.product.domain.ProductModel;
import com.ruoyi.purchase.domain.PurchaseModel;
import com.ruoyi.sale.domain.*;
import com.ruoyi.warehousing.domain.Warehousing;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author WangChangShuo
 * @date 2022年05月26日 9:45
 */
@Mapper
public interface SaleGoodsMapper {
    /**
     * 查新销货单数据集合
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsList(SaleGoodsOrder saleGoodsOrder);

    List<SaleGoodsOrder> selectsalenum(String saleordernum);

    String selectsalenuma(String saleordernum);

    List<SaleGoodsOrder> selectorderid(String saleordernum);

    /**
     * 用与查询销货单子表状态未完成的
     */
    List<SaleGoodsOrder> selectSaleGoodsListInvoice(SaleGoodsOrder saleGoodsOrder);

    List<SaleGoodsOrder> selectSaleGoodsByDate(Date date);

    List<SaleGoodsModel> selectAllModels();

    /**
     * 查询销货单子表数据
     *
     * @param hashMap 查询条件
     */
    SaleGoodsModel selectSaleGoodsModel(HashMap<Object, Object> hashMap);

    SaleGoodsModel selectSalegoodsModelReturn(Long saleGoodsId);

    List<SaleGoodsModel> selectReturnNum(Long saleGoodsId);

    /**
     * 插入销货单集合数据
     *
     * @param saleGoodsOrder 插入数据
     */
    int insertSaleGoodsOrder(SaleGoodsOrder saleGoodsOrder);

    int insertSaleGoodsOrderPda(SaleGoodsOrder saleGoodsOrder);

    int insertSaleGoodsModelsPda(SaleGoodsModel saleGoodsModel);

    int addAfter(SaleGoodAfter saleGoodAfter);

    /**
     * 插入销货单子表数据
     *
     * @param saleGoodsModel 插入子表数据
     */
    int insertSaleGoodsModels(SaleGoodsModel saleGoodsModel);

    int updateBackNum(HashMap hashMap);

    BigDecimal selectPrice(Map<String,Object> resMap);

    /**
     * 查询销货单数据集合
     *
     * @param hashMap 查询条件
     */
    SaleGoodsOrder selectSaleGoodsById(HashMap<String, Object> hashMap);

    /**
     * 查询销货单的销货单子表数据
     *
     * @param saleGoodsId 销货单主键
     */
    List<SaleGoodsModel> selectSaleGoodsModelById(Long saleGoodsId);

    /**
     * 修改销货单子表数据
     *
     * @param saleGoodsModel 修改的数据
     */
    int updateSaleGoodsModel(SaleGoodsModel saleGoodsModel);

    /**
     * 删除销货单子表数据
     *
     * @param arrayList 需要删除的主键
     */
    int deleteSaleGoodsModelById(ArrayList<Long> arrayList);

    /**
     * 确认开票信息
     *
     * @param saleGoodsOrder 开票信息
     */
    int updateSaleGoodsOrder(SaleGoodsOrder saleGoodsOrder);

    /**
     * 根据销货单状态查询
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsByStatus(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询销货单数据
     *
     * @param companyId 公司主键
     */
    List<SaleGoodsOrder> selectSaleGoodsCustObj(Long companyId);


    List<SaleorderModel> selectNum(SaleGoodsModel saleGoodsModel);


    /**
     * 查询所有的销货单信息
     *
     * @param hashMap 查询条件
     */
    SaleGoodsOrder selectSaleGoodsByIds(HashMap<String, Object> hashMap);

    /**
     * 查询销货单子表数据集
     *
     * @param saleGoodsModel 销货单子表查询条件
     */
    SaleGoodsModel selectSaleGoodsModelByIds(SaleGoodsModel saleGoodsModel);

    /**
     * 查询销货单子表数据集合
     *
     * @param hashMap 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByMap(HashMap hashMap);

    /**
     * 查询销货单子表数据
     *
     * @param saleGoodsModelId 销货单子表主键
     */
    SaleGoodsModel selectSaleGoodsModelByModelId(Long saleGoodsModelId);

    List<SaleGoodsModel> selectSaleGoodsModeslList(Long saleGoodsModelId);

    /**
     * 查询销售订单剩余
     *
     * @param saleGoodsId 销货单主键
     */
    List<SaleGoodsOrder> selectSaleGoodsResidue(Long saleGoodsId);

    /**
     * 微信公众号查询审核销货单详情
     *
     * @param saleGoodsId 查询条件
     */
    List<Product> selectProcurementByIds(Long saleGoodsId);

    /**
     * 查询销货单数据集合
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsLists(SaleGoodsOrder saleGoodsOrder);

    /**
     * 修改销货单状态
     *
     * @param hashMap 需要修改的数据
     */
    int updateSaleGoodsStatus(HashMap hashMap);

    void  updateSaleGoodsModelById(SaleGoodsModel saleGoodsModel);

    /**
     * 根据库存条件查询销货单子表数据集合
     *
     * @param hashMap 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelWarehousingOrderIsSuppByMap(HashMap hashMap);

    /**
     * 查询订单审核 中销售退货信息
     *
     * @param saleGoodsId 查询条件
     */
    List<Product> selectSaleGoodsModelByNo(Long saleGoodsId);

    /**
     * 查询销货单列表
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsListes(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询销售商品展示清单
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsShowList(SaleGoodsOrder saleGoodsOrder);

    /**
     * 通过状态选择销售货物客户对象
     *
     * @param companyId 公司逐渐
     * @return 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsCustObjByStatus(Long companyId);

    /**
     * 查询销货单数量及批次
     *
     * @param map 查询条件
     */
//    SaleGoodsModel selectSaleModelByMap(Map<String, Object> map);

    List<SaleGoodsModel> selectSaleModelListByMap(Map<String, Object> map);

    /**
     * 查询销货单数量及批次
     *
     * @param map 查询条件
     */
    SaleGoodsOrder selectSaleGoodsByMap(Map<String, Object> map);

    /**
     * 查询出库订单数据
     *
     * @param map 查询集合
     */
    List<SaleGoodsOrder> selectSaleGoodsListByMap(Map<String, Object> map);

    /**
     * 查询销货单子表数据
     *
     * @param saleGoodIdList 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByList(@Param("list") List<Long> saleGoodIdList, @Param("deptId") Long deptId);

    List<SaleGoodsModel> selectSaleGoodsModelByLista(SaleGoodsModel saleGoodsModels);

    /**
     * 批量更新销货单数据
     *
     * @param list 需要更新的数据
     */
    int updateSaleGoodsModelList(@Param("list") List<SaleGoodsModel> list);

    /**
     * 查询销货单子表数据
     *
     * @param longs 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByLists(List<Long> longs);

    SaleGoodsModel selectSaleGoodsModelTendency(SaleGoodsModel saleGoodsModel);

    int selectSumAllnum(SaleGoodsModel saleGoodsModel);

    SaleGoodsModel selectModelTime(ProductModel productModel);



    /**
     * 插入销货单 选择销售订单的数量
     *
     * @param saleNumRecords 需要插入的数据
     */
    int insertSaleNumRecordList(List<SaleNumRecord> saleNumRecords);

    /**
     * 根据销货单主键查询记录表
     *
     * @param saleGoodsId 查询条件
     */
    List<SaleNumRecord> selectSaleNumRecordById(Long saleGoodsId);

    /**
     * 删除销货单数量记录
     *
     * @param longs 删除条件
     */
    int deleteSaleNumRecordList(@Param("list") List<Long> longs);

    /**
     * 审核销售订单修改
     *
     * @param saleGoodsId 销货单主键
     */
    List<SaleorderModel> selectAuditReject(Long saleGoodsId);

    int deleteSaleGoodsModelBySaleGoodsId(Long saleGoodsId);

    /**
     * 退回审核 计算采购单子表 之前的出库数量
     *
     * @param orderId
     * @return
     */
    List<PurchaseModel> selectPurModelBeforOutNum(Long orderId);

    List<PurchaseModel> selectProcurementAfterOutNum(ArrayList<Long> salegoodsModelIds);

    /**
     * 按列表选择销售商品型号
     *
     * @param maps 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByListes(List<Map> maps);

    /**
     * 查询PDA选择销售商品清单
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsListByPDA(SaleGoodsOrder saleGoodsOrder);



    /**
     * 确认开票信息
     * * @param saleGoodsOrder 开票信息
     *
     * @param saleGoodsId 开票信息
     */
    int updateSaleorderOrderIsPays(List<Long> saleGoodsId);

    int updateSaleorderOrderIsPayes(List<Long> saleGoodsId);

    int updateSaleOrderModel(SaleorderModel saleorderModel);


    /**
     * 查询所有的销货单的子表数据
     *
     * @param saleGoodsModelIdList 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByModelIdList(List<Long> saleGoodsModelIdList);

    /**
     * 查询开票信息不为空的数据
     *
     * @param listNew 查询条件
     */
    List<Long> selectSaleGoodsIdByList(List<Long> listNew);

    List<SaleGoodsModel> selectSaleGoodsModelByListsInvoice(List<Long> list);


    /**
     * 查询销货单数据集合
     *
     * @param hashMap 查询条件
     * @return 结果
     */
    SaleGoodsOrder selectSaleGoodsByIdIsLook(HashMap hashMap);

    public SaleGoodsModel selectModelDate(ProductModel productModel);

    List<SaleGoodAfter> selectAfterList(Long deptId);

    public  int auditSale(SaleGoodsOrder saleGoodsOrder);

    int selectSaleGoodsBySaleorderNum(String saleorderNum);


    Long querypreviousId(Map<String, Object> params);

    Long queryNextId(Map<String, Object> params);

    /**
     * 根据销货单ID修改快递下单状态
     * @param saleGoodsId 销货单ID
     * @param expressStatus 快递下单状态
     * @return 结果
     */
    @Update("UPDATE nyt_sale_goods_order SET express_status = #{expressStatus} WHERE sale_goods_id = #{saleGoodsId}")
    boolean updateExpressStatusBySaleGoodsId(@Param("saleGoodsId") Long saleGoodsId, @Param("expressStatus") String expressStatus);

    List<SaleGoodsExcel> queryExcel(SaleGoodsExcel saleGoodsExcel);

    List<Map<String, Object>> pendingReview(@Param("deptID") Long deptID);
}
